package com.ww.services;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.ww.common.exception.BusinessException;
import com.ww.common.exception.BusinessExceptionEnum;
import com.ww.common.util.JwtUtil;
import com.ww.common.util.SnowUtil;
import com.ww.domain.Member;
import com.ww.domain.MemberExample;
import com.ww.mapper.MemberMapper;
import com.ww.req.MemberLoginReq;
import com.ww.req.MemberRegisterReq;
import com.ww.req.MemberSendCodeReq;
import com.ww.resp.MemberLoginResp;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MemberService {

    private static final Logger LOG= LoggerFactory.getLogger(MemberService.class);

    @Resource
    private MemberMapper memberMapper;

    public int Count(){
        // Math.toIntExact 强制转为int型
        return Math.toIntExact(memberMapper.countByExample(null));
    }

    public long register(MemberRegisterReq req){
        String mobile = req.getMobile();
        //实例化 memberExample 类
        Member memberDB = getMobile(mobile);
        // 如果list不为空
        if (ObjectUtil.isNull(memberDB)){
            //  第一种做法，直接返回list中的id。因为只有一条数据所以get(0)
            //  return list.get(0).getId();
            //  第二种做法，抛出异常
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_EXIST);
        }
        //  ctrl + alt + v 快速生成变量
        Member member = new Member();
        // 系统时间戳
        member.setId(SnowUtil.getSnowflakeNextId());
//        member.setId(17L);
        member.setMobile(mobile);

        memberMapper.insert(member);
        return member.getId();
    }
    // 验证码接口
    public void sendCode(MemberSendCodeReq req){
        String mobile = req.getMobile();
        Member memberDB = getMobile(mobile);

        // 如果list不为空,则插入一条记录
        if (ObjectUtil.isNull(memberDB)){
            LOG.info("手机号不存在，插入一条记录");
            Member member = new Member();
            member.setId(SnowUtil.getSnowflakeNextId());
            member.setMobile(mobile);
            memberMapper.insert(member);
        }else {
            LOG.info("手机号存在，不插入记录");
        }
        // 生成验证码
        String code = RandomUtil.randomString(4);
        LOG.info("生成短信验证码: {}",code);

        // 保存短信记录  手机号，短信验证码，有效期，是否已经使用，业务类型，发生时间，使用时间
        LOG.info("保存短信记录");
        // 对接短信通道，发送短信
        LOG.info("对接短信通道，发送短信");
    }
    // 登录接口
    public MemberLoginResp Login(MemberLoginReq req){
        String mobile = req.getMobile();
        String code = req.getCode();
        Member memberDB = getMobile(mobile);

        // 如果list为空,则插入一条记录
        if (ObjectUtil.isNull(memberDB)){
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_NOT_EXIST);
        }

        // 效验短信验证码,如果验证码错误抛出异常
        if (!"8888".equals(code)){
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_CODE_ERROR);
        }

        // 将 memberDB 对象复制到 MemberLoginResp.class 类里面
        MemberLoginResp memberLoginResp = BeanUtil.copyProperties(memberDB, MemberLoginResp.class);
        String token = JwtUtil.createToken(memberLoginResp.getId(),memberLoginResp.getMobile());
        memberLoginResp.setToken(token);
        return memberLoginResp;

    }

    private Member getMobile(String mobile) {
        MemberExample memberExample = new MemberExample();
        // 创建一个where条件 ，where mobile = “手机号”
        memberExample.createCriteria().andMobileEqualTo(mobile);
        // 把上面条件加入到查询语句,返回list
        List<Member> list = memberMapper.selectByExample(memberExample);

        // 如果list为空，就返回一个空,存在就返回第一条数据
        if (CollUtil.isEmpty(list)){
            return null;
        }else {
            return list.get(0);
        }
    }
}
